package hn.cch.flink.demo;

import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

public class WorkCount {

    public static void main(String[] args) throws Exception {
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // 设置并行度为 1
        env.setParallelism(1);
        // 构建输入数据流
        DataStream<String> text = env.fromElements(
            "Hello World",
            "Hello Flink",
            "Hello Scala",
            "Hello Java"
        );
        // 对输入数据进行操作，包括分割、映射和聚合
        DataStream<Tuple2<String, Integer>> counts = text
            .flatMap(new Tokenizer())
            // keyBy(0) 操作按照元组的第一个字段（索引为0）进行分组。在这个例子中，这就表示根据每个单词（字符串）进行分组。
            .keyBy((KeySelector<Tuple2<String, Integer>, Object>) tuple2 -> tuple2.f0)
            // sum(1) 是一个聚合操作，它对每个分组内的元素进行求和。在这个例子中，对元组的第二个字段（索引为1）进行求和，表示每个单词的出现次数。
            .sum(1);

        // 输出结果
        counts.print();
        // 执行任务
        env.execute("Flink Streaming Java WordCount");
    }


}

